// cal("9/3+7*(5+2)").then((res) => {
//     console.log(`ok============`, res)
// })
window.addEventListener('click', e => {
    // console.log(e)
    if (e.target.attributes.key) {
        let val = e.target.attributes.key.nodeValue;
        displayChange(val, val)
        // console.log(val)

    }
})

async function displayChange(type, data) {

    let node = document.querySelector("#display-in");
    let node_out = document.querySelector("#display-out");
    switch (type) {
        case "AC":
            node.innerText = ""
            node_out.innerText = "0"
            break;

        case "=":
            let result = await cal(node.innerText);
            if (!result) {
                console.log('er======================')
            }
            node_out.innerText = result
            break;



        case "del":
            let oldText = node.innerText
            let newText = oldText.substring(0, oldText.length - 1);
            newText = newText
            node.innerText = newText
            break;

        default:
            // if (node.innerText == "_" || node.innerText == "ERR" || node.innerText == "0") {
            //     // node.innerText = data;
            // } else 
            if (data.match(/[\+\-\*\/]/) && node.innerText.match(/[\+\-\*\/]$/)) {
                let oldText = node.innerText
                node.innerText = oldText.substring(0, oldText.length - 1);
                node.innerText += data;
            } else {
                node.innerText += data;
            }
    }
    // let blinker = document.createElement('span')
    // blinker.className = "blinker"
    // node.appendChild(blinker)
}
// function caculate(data) {
//     if (/^[1-9](d*)(\.?)(\d*)(\D{1})[1-9](\d*)(\.?)(\d*)$/.test(data)) {
//         let arr = data.match(/[1-9](d*)(\.?)(\d*)/g);
//         let num1 = arr[0];
//         let num2 = arr[1];
//         let operator = data.match(/(\+|-)/);
//         operator = operator ? operator[0] : data.match(/(\*|\/)/)[0]
//         // console.log(num1, operator, num2)
//         switch (operator) {
//             case "+":
//                 return num1 + num2;
//                 break;

//             case "-":
//                 return num1 - num2;
//                 break;
//             case "*":
//                 return num1 * num2;
//                 break;
//             case "/":
//                 return num1 / num2;
//                 break;
//         }
//     } else {
//         return "ERR"
//     }
// }
function cal(inData) {
    inData += "$"
    return new Promise(async (resolve, reject) => {
        let DATA = {
            "E": [],
            "T": [],
            "F": [],
            "i": []
        }
        async function _fn(iinData, outData, nowStatusArr, cb) {
            try {
                let R = [
                    0,
                    ["E", "=>", "E+T", () => (DATA.E.pop() + DATA.T.pop())],
                    ["E", "=>", "E-T", () => (DATA.E.pop() - DATA.T.pop())],
                    ["E", "=>", "T", () => (DATA.T.pop())],
                    ["T", "=>", "T*F", () => (DATA.T.pop() * DATA.F.pop())],
                    ["T", "=>", "T/F", () => (DATA.T.pop() / DATA.F.pop())],
                    ["T", "=>", "F", () => (DATA.F.pop())],
                    ["F", "=>", "(E)", () => (DATA.E.pop())],
                    ["F", "=>", "i", () => (DATA.i.pop())]
                ];
                let str_i = inData.substring(0, 1)
                if (/^\d+(\.)?\d*/.test(str_i)) {
                    let num = inData.match(/^\d+(\.)?\d*/)[0];
                    DATA.i.push(+(num))
                    inData = inData.replace("" + num, "i")
                    return _fn(iinData, outData, nowStatusArr, cb)
                }
                let nowStatus = nowStatusArr[nowStatusArr.length - 1]
                //log str_i
                console.log("Pre=", 'in:', inData, "out:===", outData, DATA)
                console.log("str_i=", str_i, "nowStatus==", nowStatus)
                console.log(nowStatusArr)
                //test
                let outFlag = await slrFn(nowStatus, str_i);
                console.log('SLR_outFlag==', outFlag, '\n')
                if (outFlag === "acc") {
                    cb && cb({ code: 1, outData })
                    return
                }
                let index
                if (outFlag.match(/^S\d+$/)) {
                    index = outFlag.match(/\d+/)[0]
                    outData += str_i;
                    inData = inData.substring(1)
                    nowStatusArr.push(index)
                    return _fn(iinData, outData, nowStatusArr, cb)
                } else if (outFlag.match(/^\d+$/)) {
                    outData += str_i;
                    inData = inData.substring(1)
                    nowStatusArr.push(outFlag)
                    return _fn(iinData, outData, nowStatusArr, cb)
                } else if (outFlag.match(/^R\d+$/)) {
                    index = outFlag.match(/\d+/)[0]
                    let _R = R[index]
                    let outReverse = outData.split("").reverse().join("")
                    let R2_reverse = _R[2].split("").reverse().join("")
                    console.log(_R[2], R2_reverse)
                    outData = outReverse.replace(R2_reverse, "")
                    outData = outData.split("").reverse().join("")
                    let R3_num = _R[3]()
                    DATA[_R[0]].push(R3_num)
                    let popStr = ""
                    let popLen = _R[2].length
                    for (let i = 0; i < popLen; i++) {
                        popStr = nowStatusArr.pop() + popStr;
                    }
                    inData = _R[0] + inData
                    return _fn(iinData, outData, nowStatusArr, cb)
                }
            } catch (error) {
                console.log(error)
                cb && cb({ code: 0 })
            }

        }
        _fn(inData, "", ["0"], ({ code, outData }) => {
            if (code === 1) {
                resolve(DATA[outData].pop())
            } else {
                resolve("ERR")
            }
        })



    })


}
function slrFn(index, str) {
    return new Promise((resolve, reject) => {
        let SLR = new Array(16)
        SLR[0] = {
            "action": {
                "i": "S5",
                "+": "",
                "-": "",
                "*": "",
                "/": "",
                "(": "S4",
                ")": "",
                "$": ""
            },
            "goto": {
                "E": "1",
                "T": "2",
                "F": "3"
            }
        }
        SLR[1] = {
            "action": {
                "i": "",
                "+": "S6",
                "-": "S7",
                "*": "",
                "/": "",
                "(": "",
                ")": "",
                "$": "acc"
            },
            "goto": {
                "E": "",
                "T": "",
                "F": ""
            }
        }
        SLR[2] = {
            "action": {
                "i": "",
                "+": "R3",
                "-": "R3",
                "*": "S8",
                "/": "S9",
                "": "",
                "(": "R3",
                ")": "",
                "$": "R3"
            },
            "goto": {
                "E": "",
                "T": "",
                "F": ""
            }
        }
        SLR[3] = {
            "action": {
                "i": "",
                "+": "R6",
                "-": "R6",
                "*": "R6",
                "/": "R6",
                "(": "",
                ")": "R6",
                "$": "R6"
            },
            "goto": {
                "E": "",
                "T": "",
                "F": ""
            }
        }
        SLR[4] = {
            "action": {
                "i": "S5",
                "+": "",
                "-": "",
                "*": "",
                "/": "",
                "(": "S4",
                ")": "",
                "$": ""
            },
            "goto": {
                "E": "10",
                "T": "2",
                "F": "3"
            }
        }
        SLR[5] = {
            "action": {
                "i": "",
                "+": "R8",
                "-": "R8",
                "*": "R8",
                "/": "R8",
                "(": "",
                ")": "R8",
                "$": "R8"
            },
            "goto": {
                "E": "",
                "T": "",
                "F": ""
            }
        }
        SLR[6] = {
            "action": {
                "i": "S5",
                "+": "",
                "-": "",
                "*": "",
                "/": "",
                "(": "S4",
                ")": "",
                "$": ""
            },
            "goto": {
                "E": "",
                "T": "11",
                "F": "3"
            }
        }
        SLR[7] = {
            "action": {
                "i": "S5",
                "+": "",
                "-": "",
                "*": "",
                "/": "",
                "(": "S4",
                ")": "",
                "$": ""
            },
            "goto": {
                "E": "",
                "T": "12",
                "F": "3"
            }
        }
        SLR[8] = {
            "action": {
                "i": "S5",
                "+": "",
                "-": "",
                "*": "",
                "/": "",
                "(": "S4",
                ")": "",
                "$": ""
            },
            "goto": {
                "E": "",
                "T": "",
                "F": "13"
            }
        }
        SLR[9] = {
            "action": {
                "i": "S5",
                "+": "",
                "-": "",
                "*": "",
                "/": "",
                "(": "S4",
                ")": "",
                "$": ""
            },
            "goto": {
                "E": "",
                "T": "",
                "F": "14"
            }
        }
        SLR[10] = {
            "action": {
                "i": "",
                "+": "S6",
                "-": "S7",
                "*": "",
                "/": "",
                "(": "",
                ")": "S15",
                "$": ""
            },
            "goto": {
                "E": "",
                "T": "",
                "F": ""
            }
        }
        SLR[11] = {
            "action": {
                "i": "",
                "+": "R1",
                "-": "R1",
                "*": "S8",
                "/": "S9",
                "(": "",
                ")": "R1",
                "$": "R1"
            },
            "goto": {
                "E": "",
                "T": "",
                "F": ""
            }
        }
        SLR[12] = {
            "action": {
                "i": "",
                "+": "R2",
                "-": "R2",
                "*": "S8",
                "/": "S9",
                "(": "",
                ")": "R2",
                "$": "R2"
            },
            "goto": {
                "E": "",
                "T": "",
                "F": ""
            }
        }
        SLR[13] = {
            "action": {
                "i": "",
                "+": "R4",
                "-": "R4",
                "*": "R4",
                "/": "R4",
                "(": "",
                ")": "R4",
                "$": "R4"
            },
            "goto": {
                "E": "",
                "T": "",
                "F": ""
            }
        }
        SLR[14] = {
            "action": {
                "i": "",
                "+": "R5",
                "-": "R5",
                "*": "R5",
                "/": "R5",
                "(": "",
                ")": "R5",
                "$": "R5"
            },
            "goto": {
                "E": "",
                "T": "",
                "F": ""
            }
        }
        SLR[15] = {
            "action": {
                "i": "",
                "+": "R7",
                "-": "R7",
                "*": "R7",
                "/": "R7",
                "(": "R7",
                ")": "R7",
                "$": "R7"
            },
            "goto": {
                "E": "",
                "T": "",
                "F": ""
            }
        }
        let outFlag = SLR[index]['action'][str]
        if (!outFlag) {
            outFlag = SLR[index]['goto'][str]
        }
        resolve(outFlag)
    })
}
